<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>

</head>
<body>
  <script>
    // 知识点:Promise的链式调用特征
    // 创建Promise对象
    // 基本语法
    let p = new Promise((resolve, reject) => {
    //   // 异步任务:ajax,定时器,计时器
      setTimeout(()=>{
        // reject('成功')
  reject('失败')
      },1000)//一秒是ajax需要请求+响应总耗费时间（模拟）// 一般promise配合axios一起使用的cp
    })
    // 如何拿到Promise对象里成功和失败的结果.必须有以下才可以拿到，不然拿不到
    // // resolve（）->.then()里函数体代码执行
    // // reject（）->.catch()里面函数体代码执行
    // p.then (res=>{
    //   console.log(res);//成功
    // })
    // p.then(err=>{
    //   console.log(err);
    // })

    // 高级语法1：
    // 口诀：Promise对象.then()在原地会有一个返回值，是一个全新的Promise
    // let P1=p.then()
    // console.log(P1===p);//false

    // // 高级用法2：
    // // 口诀：then()里函数体里return，返回给下一个Promise对象使用
    // //***** 如：return的是非Primise对象
    // let p2= p.then(res => {
    //   // res就是上面成功数据
    //   return 500//特殊：returnP2（下一个Promise对象的then里使用）
    //   })
    //   p2.then(result=>{
    //     console.log(result);//500
    //   })

      // 情况2：return是一个新的Promise对象，替换then（）函数默认在原地返回那个全新的Promise对象
      // 下一个then里拿到的是return的这个Promise对象里的resolve结果
      // let  p2=p.then (res=>{
      //   console.log(res);
      //   return  new Promise((reslove,reject )=>{
      //     setTimeout(()=>{
      //       resolve('第二次成功值')
      //     },3000)
      //   })
      // })
      // p2.then(result=>{
      //   console.log(result);//第二次成功值
      // })

// 高级用法3：
// catch（）里return会返回到，下一个promise队形的then使用
// 总结：无论then/cath里（）函数体的return，都会返回给下一个Promise的then里
      // function myAxios(){
      //   let pA=new Promise((resolve,reject)=>{
      //     setTimeout(()=>{
      //       reject('失败')
      //     },2000)
      //   })
      //   return pA
      // }
      // let pA= myAxios()//模拟axios（）函数，以前await Pa那结果，但是现在中间处理后，用await 取pB结果（只能取成功）
      
      // let  pB=pA.then(res=>{
      //   return[null,res]//return res
      // }).catch(err=>{
      //   return[err,null]//会返回给p2的then使用（pB的错误信息中转下去）//return err
      //       })
      //       async function myFn(){//逻辑页面拿处理后的Promise对象接货（有成功和失败）
      //         const [err,res]=await pB//await还是取代pB的then
      //         if(err)console.error(err)
      //         else console.log(res)
      //         // 1个变量位置无法区分时成功值还是是白纸，那么在中转的地方传出一个数组
      //         // 数组的第一个位置错误信息，第二个位置正确信息
      //       }
      //       myFn()


        // 高级用法4：
          // 口诀：Promise对象.catch()在原地会有一个返回值，是一个全新的Promise
          // 链式调用：每个函数里返回同样的一个对象，继续点调用内部的其他方法，一直点下去就是链式调用
          // let pa = p.then().catch()
          // console.log(pa === p);//false

  </script>
</body>
</html>